package com.liusy.code.wizards;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;


/**
 * 
 * 
 * @author liusy
 *
 */
public abstract class DynamicPageWizard extends Wizard { 
    /** 
     * 向导中的所有向导页，注意：指的是增加或者减少之后的向导页
     */ 
    private List<IWizardPage> pages = new ArrayList<IWizardPage>(); 

    
    /** 
     * 构造函数，创建一个空的向导
     */ 
    protected DynamicPageWizard() { 
        super(); 
    } 

    /* 
     * (non-Javadoc) 
     * @see org.eclipse.jface.wizard.Wizard#addPage(org.eclipse.jface.wizard.IWizardPage) 
     */ 
    public void addPage(IWizardPage page) { 
    	 // 重写父类方法，添加向导页，并将向导页的向导设置为当前对象
    	page.setWizard(this);
    	pages.add(page);
    	super.addPage(page);
    	
    } 
    
    /** 
     * 在指定的向导页前插入向导页
     * 
     * @param page 
     * @param nextPage 
     * @return 
     */ 
    public boolean addPage(IWizardPage page, IWizardPage nextPage) { 
    	 for(int i = 0; i < pages.size(); i++) { 
    		 if(pages.get(i) == nextPage) { 
    			 return addPage(page, i); 
    		 } 
    	 } 
    	 return false; 
    } 
    
    /** 
     * 在指定的位置插入向导页
     * 
     * @param page 
     * @param location 
     */ 
    public boolean addPage(IWizardPage page, int location) { 
    	 // Invalid location 
    	 if(location < 0 || location > pages.size()) 
    		 return false; 
    	
    	 // Create the new page list 
    	 List<IWizardPage> newPages = new ArrayList<IWizardPage>(); 
    	 for(int i = 0; i < location; i++) { 
    		 newPages.add(pages.get(i)); 
    	 } 
    	
    	 page.setWizard(this); 
    	 newPages.add(page); 
    	
    	 for(int i = location; i < pages.size(); i++) { 
    		 newPages.add(pages.get(i)); 
    	 } 
    	
    	 // Set the relationship 
    	 if(location != pages.size()) 
    		 ((IWizardPage)newPages.get(location + 1)).setPreviousPage(page); 
    	
    	 ((IWizardPage)page).setPreviousPage((IWizardPage)newPages.get(location - 1)); 
    	 pages = newPages; 
    	 return true; 
    } 

    
    /** 
     * 删除指定位置的向导页
     * 
     * @param number 
     */ 
    public void removePage(int number) { 
    	 if(number < 0) 
    		 return; 
    	 if(number > pages.size() - 1) 
    		 return; 

    	 if(number == 0) 
    		 pages.remove(0); 
    	 else if(number == pages.size() - 1) 
    		 pages.remove(number); 
    	 else { 
	    	 IWizardPage wizarPage = (IWizardPage)pages.get(number + 1); 
	   		 wizarPage.setPreviousPage((IWizardPage)pages.get(number - 1)); 
	   		 pages.remove(number); 
    	 } 
    } 
    
    /** 
     * 删除指定的向导页
     * 
     * @param page 
     */ 
    public void removePage(IWizardPage page) { 
    	 int number = -1; 
    	 for(int i = 0; i < pages.size(); i++) { 
    		 if(pages.get(i) == page) 
    			 number = i; 
    	 } 
    	
    	 removePage(number); 
    } 
    
    
    /** 
     * 删除向导中某种类名的所有向导页
     * 
     * @param number 
     */ 
    public void removePage(String className) { 
       for(int i = 0; i < pages.size(); i++) { 
    	 if(pages.get(i).getClass().getCanonicalName().equalsIgnoreCase(className)) 
    			 removePage(i); 
    	 } 
    } 
    
 }